<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  function Cat(name, color) {
    // {}
    // this -> {}
    this.name = name;
    this.color = color;

    // this[[prototype]] = Cat.prototype;
    // this.__proto__ = Cat.prototype;
    // return this;
  }

  //  Cat.prototype 原型对象的本质是一个对象
  // Cat.prototype.constructor = Cat;
  Cat.prototype.species = "cat";
  Cat.prototype.call = function () {
    console.log("喵喵");
  }
  Cat.prototype.skill = function () {
    console.log("捉老鼠");
  }

  // 此方法虽然存在原型对象中, 但是调用时 是由实例化对象访问的 Tom.say() =>this指向调用此方法的实例化对象
  Cat.prototype.say = function () {
    console.log(this.name, this.color);
  }

  Object.prototype.hello = "你好";


  var Tom = new Cat("Tom", "black");
  console.log(Tom);

  var arr = new Array(1, 2, 3, 4);
  var obj = new Object({ a: 1, b: 2 });

  // console.log(Tom.hello);
  // console.log(arr.hello);
  // console.log(obj.hello);

  // instanceOf()  判断某个实例化对象的原型链上 是否存在 某个构造函数 的原型对象
  // Tom -> Cat.prototype(Tom.__proto__)  ->  Object.prototype( Cat.prototype.__proto__) -> null
  // arr -> Array.prototype(arr.__proto__)  ->  Object.prototype( Array.prototype.__proto__) -> null

  // console.log(Tom instanceof Cat, Tom instanceof Object);
  // console.log(arr instanceof Array, arr instanceof Object);

  // isPrototypeOf() 判断某个构造函数的原型对象  是否存在于  某个实例化对象的原型对象上
  // console.log(Cat.prototype.isPrototypeOf(Tom));
  // console.log(Object.prototype.isPrototypeOf(Tom));

  // in     判断某个属性  是否存在于  一个实例化对象(实例对象)的原型链上  =>   判断的一个实例化对象(实例对象)的原型链上是否存在某个属性
  // for (var key in Tom) {  //遍历实例本身及其原型链上
  //     console.log(key);
  // }

  // console.log("name" in Tom);
  // console.log("species" in Tom);
  // console.log("say" in Tom);
  // console.log("hello" in Tom);

  // hasOwnProperty(key)      判断的一个实例化对象(实例对象)上是否存在某个属性
  // console.log(Tom.hasOwnProperty("name"));
  // console.log(Tom.hasOwnProperty("color"));
  // console.log(Tom.hasOwnProperty("species"));


  var date = new Date()
  var reg = new RegExp();
  // toString()      将实例化对象转化为字符串
  // console.log(Tom)
  // console.log(arr)
  // console.log(obj)
  console.dir(date);
  console.dir(reg);

  console.log(Tom.toString());
  console.log(obj.toString());


    // console.log(arr.toString());
    // console.log(date.toString());




</script>

</html>